# 演示: 原函数是有参无参,有返回值无返回值, 装饰器的内部函数和原函数保持一致
# 不同的源函数有不同的装饰方式, 根据原函数有5种装饰方式, 影响闭包的内部函数
# 1 定义装饰器
# 2 装饰原函数
# 3 调用装饰器

# 1 ------------------------------
# 1 定义装饰器
def print_info(func):               # 有嵌套 外层函数
    def inner():                    # 有嵌套 内层函数
        print('友好提示: 正在计算中...') # 添加功能
        func()                      # 有引用
    return inner                   # 有返回内部函数名


# 装饰原函数
@print_info
def get_sum():
    a = 10
    b = 20
    c = a + b
    print('两数之和:', c)


def  dm01_无参数无返回值():
    get_sum()



# 2 ------------------------------
# 1 定义装饰器 有参无返回值
def print_info2(func):
    def inner(x, y):
        print('友好提示: 正在计算中...')
        func(x, y)
    return inner


# 装饰原函数
@print_info2
def get_sum2(a, b):
    c = a + b
    print('两数之和:', c)


def dm02_有参数无返回值():
    get_sum2(10, 20)
    pass


# 3 ---------------------------
# 1 定义装饰器 无参有返回值
def print_info3(func):
    def inner():
        print('友好提示: 正在计算中...')
        result = func()
        return result
    return inner


# 装饰原函数
@print_info3
def get_sum3():
    a = 10
    b = 20
    c = a + b
    return c


def dm03_无参数有返回值():
    result = get_sum3()
    print('result-->', result)


# 4 ---------------------------
# 1 定义装饰器 有参有返回值
def print_info4(func):
    def inner(x, y):
        print('友好提示: 正在计算中...')
        result = func(x, y)
        return result
    return inner


# 装饰原函数
@print_info4
def get_sum4(a, b):
    c = a + b
    return c


def dm04_有参数有返回值():
    result = get_sum4(20, 30)
    print('result-->', result)


if __name__ == '__main__':
    print('-----------------dm01_无参数无返回值---------------------------------')
    dm01_无参数无返回值()
    print('----------------dm02_有参数无返回值----------------------------------')
    dm02_有参数无返回值()
    print('------------------dm03_无参数有返回值--------------------------------')
    dm03_无参数有返回值()
    print('-----------------dm04_有参数有返回值---------------------------------')
    dm04_有参数有返回值()
    print('-----------------装饰器 End---------------------------------')

